package com.test.generic;

import com.test.generic.testC.Father;
import com.test.generic.testC.GrandFather;
import com.test.generic.utilclass.Animal;
import com.test.generic.utilclass.Dog;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description:
 * 摘自掘金作者
 *  为什么要使用通配符而不是简单的泛型呢？
 *  通配符其实在声明局部变量时是没有什么意义的，但是当你为一个方法声明一个参数时，它是非常重要的。
 *  在声明一个方法时，很重要
 * <href> https://juejin.cn/post/6844903917835419661 </href>

 me： 自己一开始也思考过这个问题，可能时自己看的时候比较粗心吧，
    由于没有仔细看完java编程思想对知识的讲解，当时似乎觉得这只是个鸡肋的东西。
       现在的思考就是：
 * @Author: yangzhiwei
 * @Date: 2021/2/18 11:04
 */
public class NoBorderGeneric {
    static int countLegs (List<? extends Animal> animals ) {
        int retVal = 0;
        for ( Animal animal : animals )
        {
            retVal += animal.countLegs();
        }
        return retVal;
    }

    static int countLegs1 (List<Animal> animals ){
        int retVal = 0;
        for ( Animal animal : animals )
        {
            retVal += animal.countLegs();
        }
        return retVal;
    }

    public static void main(String[] args) {
        List<Dog> dogs = new ArrayList<>();
        // 不会报错
        // countLegs( dogs );
        // 报错
      //  countLegs1(dogs);
        GrandFather<Father> grandFather = new GrandFather<>();
    }
}
